/**
 * 无限级别分类(SELECT标签版)
 * @param params 参数 JSON格式
 * @date 2018 12 29
 * @author YUE
 */
function NoLimitCategory(params){

    var data = (typeof(params.data) === 'undefined') ? null : params.data;
    var cont = (typeof(params.cont) === 'undefined') ? null : params.cont;
    var defaultOption = (typeof(params.defaultOption) === 'undefined') ? "请选择" : params.defaultOption;
    var onSelectCreate = (typeof(params.onSelectCreate) === 'undefined') ? function(){} : params.onSelectCreate;

    //参数判断
    if(data instanceof Array && !(data.length > 0)){
        throw new Error("参数[data]错误，无限极分类：数据不完整");
    }

    if(cont == null){
        throw new Error("参数[cont]错误，容器对象不能为空");
    }

    var self = this;

    //删除选择的SELECT后的所有SELSECT
    var removeSelectAfter = function(seleObj){

        var selects = cont.getElementsByTagName("select");
        var length = selects.length;
        var temp = 0;

        //先找出选择的是第几个SELECT
        for(var i=0; i<length; i++){
            if(selects[i] == seleObj){
                temp = i;
            }
        }

        //删除当前SELECT后的所有SELECT
        for(var i=0; i<(length - temp -1); i++){
            cont.removeChild(selects[temp+1]);
        }
    };

    /**
     * 递归追加SELECT标签
     * @param data 数据
     * @param isContinue 是否追加下一级
     */
    var appendSelect = function(pid){

        var select = document.createElement("select");

        cont.appendChild(select);
        onSelectCreate(select);

        if(data.length > 0 && typeof(defaultOption) == 'string' && defaultOption != ''){
            var option = document.createElement("option");
            option.value = 0;
            option.innerHTML = defaultOption;
            select.appendChild(option);
        }

        //遍历子分类并创建
        var childrenData = self.getChildren(pid);
        for(var i=0; i<childrenData.length; i++){
            var option = document.createElement("option");
            option.value = childrenData[i].id;
            option.innerHTML = childrenData[i].name;
            select.appendChild(option);
        }

        //添加改变事件
        select.onchange = function(){
            removeSelectAfter(select);

            var selectValue = parseInt(select.value);

            //如果所选项目有效（不为零）且有子项目，递归追加
            if(selectValue > 0 && self.getChildren(selectValue).length > 0){
                appendSelect(selectValue);
            }
        }
    }

    /**
     * 递归初始化已选择分类
     * @param id 项目ID
     */
    var initSelect = function(id){
        id = parseInt(id);

        var pid = self.getParentId(id);

        if(pid != null){
            var select = $('<select></select>');

            $(cont).prepend(select);
            onSelectCreate(select);

            //创建默认项
            var childrenData = self.getChildren(pid);
            if(childrenData.length > 0){
                select.append('<option value="0">'+defaultOption+'</option>');
            }

            //遍历子分类并创建
            for(var i=0; i<childrenData.length; i++){
                var option = document.createElement("option");
                option.value = childrenData[i].id;
                option.innerHTML = childrenData[i].name;
                if(parseInt(childrenData[i].id) === id){
                    option.selected = "selected";
                }
                select.append(option);
            }

            //添加改变事件
            select.on("change", function () {
                removeSelectAfter(select.get(0));
                var selectValue = parseInt(select.val());
                //如果所选项目有效（不为零）且有子项目，递归追加
                if(selectValue > 0 && self.getChildren(selectValue).length > 0){
                    appendSelect(selectValue);
                }
            });

            //递归
            initSelect(pid);
        }
    }

    /**
     * 初始化
     * @param id 项目ID
     */
    this.init = function(id){
        id = parseInt(id);
        if(id>0){
            initSelect(id);
        }else{
            appendSelect(0);
        }
    }

    /**
     * 输出已选的分类ID字符串，用逗号隔开，例 1,5,28 依次为1级2级3级……分类
     * 比如在表单提交时会用到
     * @returns {string}
     */
    this.getValuesStr = function() {
        var selects = cont.getElementsByTagName("select");
        var temp = "";
        for(var i=0; i<selects.length; i++){
            temp += ","+selects[i].value;
        }
        temp = temp.replace(/^,/gi, "");//去掉前边的逗号
        temp = temp.replace(/,0$/gi, "");//去掉后边的0及逗号
        return (temp === "0") ? "" : temp;
    };

    /**
     * 得到最后一个SELECT的值，如果是空值就往前一个SELECT
     * @returns {number}
     */
    this.getValue = function() {
        var selects = cont.getElementsByTagName("select");
        for(var i=(selects.length-1); i>=0; i--){
            if(parseInt(selects[i].value) > 0){
                return parseInt(selects[i].value);
            }
        }
        return 0;
    };

    /**
     * 得到子分类（只要最近的一级，子分类的子分类及以下都不要）
     */
    this.getChildren = function (pid) {
        pid = parseInt(pid);
        var childrenData = [];
        for(key in data){
            if(parseInt(data[key].pid) === pid){
                childrenData.push(data[key]);
            }
        }
        return childrenData;
    }

    /**
     * 得到父分类ID，如果没有返回NULL
     * @param id 分类ID
     */
    this.getParentId = function (id) {
        id = parseInt(id);
        for(key in data){
            if(parseInt(data[key].id) === id){
                return parseInt(data[key].pid);
            }
        }
        return null;
    }
}




/**
 * 调用例子：
 *
 *
 *
 *
 //无限级分类创建并初始化
 var nlc = new NoLimitCategory({
    data : cateData,
    cont : document.getElementById("cont_category"),
    defaultOption : "请选择",
    onSelectCreate : function (selectObj) {
        $(selectObj).addClass("form-select");
        var selectes = $('#cont_category').children("select");
        for(var i=0; i<selectes.length; i++){
            if(i == 0){
                $(selectes[i]).css('margin-left', '0px');
            }else{
                $(selectes[i]).css('margin-left', '5px');
            }
        }
    }
});
 nlc.init(pid);

 */